const NodeCache = require('node-cache');

// 创建缓存实例（改进版本）
const cache = new NodeCache({
    stdTTL: 600, // 默认缓存10分钟
    checkperiod: 120, // 每2分钟检查过期缓存
    useClones: false, // 提高性能
    maxKeys: 1000, // 最大缓存键数量限制
    deleteOnExpire: true // 过期自动删除
});

// 内存监控
let memoryStats = {
    maxMemoryUsage: 0,
    currentMemoryUsage: 0,
    cacheHits: 0,
    cacheMisses: 0
};

// 定期清理过期缓存
setInterval(() => {
    const stats = cache.getStats();
    memoryStats.currentMemoryUsage = process.memoryUsage().heapUsed / 1024 / 1024; // MB
    memoryStats.maxMemoryUsage = Math.max(memoryStats.maxMemoryUsage, memoryStats.currentMemoryUsage);
    memoryStats.cacheHits = stats.hits;
    memoryStats.cacheMisses = stats.misses;
    
    // 如果内存使用超过100MB，清理部分缓存
    if (memoryStats.currentMemoryUsage > 100) {
        const keys = cache.keys();
        if (keys.length > 500) {
            // 清理一半的缓存
            const keysToDelete = keys.slice(0, Math.floor(keys.length / 2));
            cache.del(keysToDelete);
            console.log('内存清理: 删除了', keysToDelete.length, '个缓存项');
        }
    }
}, 60000); // 每分钟检查一次

// 缓存中间件
function cacheMiddleware(ttl = 300) {
    return (req, res, next) => {
        const key = req.originalUrl || req.url;
        
        // 检查缓存
        const cachedResponse = cache.get(key);
        if (cachedResponse) {
            console.log('缓存命中:', key);
            return res.json(cachedResponse);
        }
        
        // 保存原始send方法
        const originalSend = res.json;
        
        // 重写send方法以缓存响应
        res.json = function(data) {
            // 只缓存成功的响应
            if (!data.error && data.success !== false) {
                cache.set(key, data, ttl);
                console.log('缓存设置:', key, 'TTL:', ttl);
            }
            originalSend.call(this, data);
        };
        
        next();
    };
}

// 清除特定缓存
function clearCache(pattern) {
    const keys = cache.keys();
    const keysToDelete = keys.filter(key => key.includes(pattern));
    
    if (keysToDelete.length > 0) {
        cache.del(keysToDelete);
        console.log('清除缓存:', keysToDelete);
    }
}

// 获取缓存统计信息
function getCacheStats() {
    return {
        keys: cache.keys().length,
        hits: cache.getStats().hits,
        misses: cache.getStats().misses,
        ksize: cache.getStats().ksize,
        vsize: cache.getStats().vsize
    };
}

module.exports = {
    cache,
    cacheMiddleware,
    clearCache,
    getCacheStats
};